import MySet from "./MySet.js";

/**
 * 求两个集合的并集
 * @param {MySet} setA
 * @param {MySet} setB
 * @returns {MySet}
 */
function union(setA, setB) {
  const newSet = new MySet();

  setA.values().forEach((value) => newSet.add(value));
  setB.values().forEach((value) => newSet.add(value));

  return newSet;
}

/**
 * 求两个集合的交集
 * @param {MySet} setA
 * @param {MySet} setB
 * @returns {MySet}
 */
function intersection(setA, setB) {
  const newSet = new MySet();

  setA.values().forEach((value) => {
    if (setB.has(value)) {
      newSet.add(value);
    }
  });

  return newSet;
}

/**
 * 求 setA - setB 的结果
 * @param {MySet} setA
 * @param {MySet} setB
 * @returns {MySet}
 */
function difference(setA, setB) {
  const newSet = new MySet();

  setA.values().forEach((value) => {
    if (!setB.has(value)) {
      newSet.add(value);
    }
  });

  return newSet;
}

/**
 * 判断 setB 是否为 setA 的子集
 * @param {MySet} setA 父集
 * @param {MySet} setB 子集
 * @returns {boolean}
 */
function isSubset(setA, setB) {
  if (setB.size() > setA.size()) {
    return false;
  }

  let isSubset = true;

  // 遍历setB中每个元素，如果都满足添加则返回true
  setB.values().every((value) => {
    if (!setA.has(value)) {
      isSubset = false;
      return false;
    }
    return true;
  });

  return isSubset;
}

export { union, intersection, difference, isSubset };
